#include "../inc/switch.h"

// Switch 构造函数，初始化开关
Switch::Switch(UI_Object* parent)
{
  // 设置父对象
  this->parent = parent;

  // 创建一个 LVGL 开关对象，并将其父对象设置为传入的 parent
  this->this_object = lv_switch_create(parent->get_lv_obj_t());

  // 设置开关的默认宽度和高度
  this->width = 96;
  this->height = 48;

  // 设置 LVGL 开关对象的高度和宽度
  lv_obj_set_height(this_object, this->height);
  lv_obj_set_width(this_object, this->width);

  // lv_obj_set_height(this->this_object, 48);
  // lv_obj_set_width(this->this_object, 96);
  
  // 添加开关状态改变事件回调
  lv_obj_add_event_cb(this->this_object, [](lv_event_t* e) {
    // 获取触发事件的对象
    lv_obj_t* obj = lv_event_get_target(e);

    // 获取用户数据（即 Switch 对象的指针）
    void* user_data = e->user_data;
    Switch* sw = (Switch*) user_data;

    // 检查开关的状态是否为打开（LV_STATE_CHECKED）
    if (lv_obj_has_state(obj, LV_STATE_CHECKED) == true)
    {
      // 如果开关状态为打开，并且 on_cb 回调函数不为空，则调用 on_cb
      if (sw->on_cb != NULL)
      {
        sw->on_cb(e);
      }
    }
    else
    {
      // 如果开关状态为关闭，并且 off_cb 回调函数不为空，则调用 off_cb
      if (sw->off_cb != NULL)
      {
        sw->off_cb(e);
      }
    }
  }, LV_EVENT_VALUE_CHANGED, this);  // 监听 LV_EVENT_VALUE_CHANGED 事件，并将 this 作为用户数据传递
}

// Switch 析构函数
Switch::~Switch()
{
  // 析构函数内容为空
}

// 设置开关状态改变时的回调函数
void Switch::on_switch_change(Switch::change_t type, Switch::on_off_cb_t cb)
{
  // 根据开关状态类型设置相应的回调函数
  if (type == Switch::change_t::OFF)
  {
    this->off_cb = cb;  // 设置关闭状态回调函数
  }
  if (type == Switch::change_t::ON)
  {
    this->on_cb = cb;  // 设置打开状态回调函数
  }
}